import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'

// 状态
const state = {
  token: getToken(), // 设置token的共享状态  初始化vuex的时候 就先从缓存中读取
  userInfo: {}// 定义空对象存放用户基本资料
}

// 修改状态
const mutations = {
  // 设置token
  setToken(state, token) {
    state.token = token// 将数据设置给vuex
    // 同步给缓存
    setToken(token)
  },
  // 删除缓存
  removeToken(token) {
    state.token = null// 将vuex的数据置空
    // vuex的数据置空了，但缓存中还没有 需同步到缓存中
    removeToken()
  },
  // 设置用户信息
  setUseinfo(state, result) {
    // 更新对象
    state.userInfo = result
  },
  // 删除用户信息
  reomveUserInfo(state) {
    state.userInfo = {}
  }
}

// 执行异步
// const actions = {
//   // 封装登录的action，需要调用登录接口,成功后设置token到vuex,失败则返回失败
//   async login(context, data) {
//     // 此处是调用api登录接口
//     const result = await login(data) // 实际上就是一个promise  result就是执行的结果
//     if (result.data.success) {
//       // true 登陆成功
//       // result.data.data 为用户token，需要将其存给state
//       // actions中只能执行异步操作，不能修改数据，修改数据需要在mutations中进行
//       // 参数1:提交给的mutations方法名，参数2:要修改的数据
//       context.commit('setToken', result.data.data)// 提交mutations设置token
//     }
//   }
// }

// 既然已经在request中已经默认去除了一层data的外衣，所以我们也将login的action进行一下改动
// 执行异步
const actions = {
  // 封装登录的action，需要调用登录接口,成功后设置token到vuex,失败则返回失败
  async login(context, data) {
    // 此处是调用api登录接口
    const result = await login(data)// 拿到token
    // 此处不需要判断响应成功与否，是因为在响应拦截器中已经做出了判断，只要能执行到此处，就说明成功了
    // 若失败了，则全返回了Promise.reject(error)
    context.commit('setToken', result)// 设置token
    // 拿到token说明登录成功
    setTimeStamp()// 设置当前的时间戳
  },

  // 用户状态会在后续的开发中，频繁用到，所以我们将用户状态同样的封装到action中
  async getUserInfo(context) {
    const result = await getUserInfo()// 获取返回值
    const baseInfo = await getUserDetailById(result.userId)// 为了获取头像
    const obj = { ...result, ...baseInfo }
    context.commit('setUseinfo', obj)// 提交到mutations 将整个的个人信息设置到用户的vuex数据中
    return result
  },

  // 登出操作
  logout(context) {
    // 1.删除token
    context.commit('removeToken')// 不仅仅删除了vuex中的 还删除了缓存中的
    // 2.删除用户资料
    context.commit('reomveUserInfo')
  }
}

// 导出一个默认配置
export default {
  namespaced: true,
  state, // es6写法
  mutations,
  actions
}
